package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func hello(i int) {
	defer wg.Done() // goroutine结束就登记-1
	fmt.Println("Hello Goroutine!", i)
}

// 多个goroutine并发执行
func multiGoroutine() {
	for i := 0; i < 10; i++ {
		wg.Add(1) // 启动一个goroutine就登记+1
		//go hello(i)
		/*go func() {
			defer wg.Done()
			fmt.Println("Hello Goroutine!", i); // 闭包，这个i指向的外部函数的i，会变化，所以打印会有重复
		}()*/
		go func(i int) {
			defer wg.Done()
			fmt.Println("Hello Goroutine!", i) // 闭包，这个i指向的外部函数的i，会变化，所以打印会有重复
		}(i)
	}
	wg.Wait() // 等待所有登记的goroutine都结束
}

// goroutine使用通道通信，不是共享内存
func main() {
	multiGoroutine()
}
